﻿/**
 * @file fs.h
 * @date 23.5.6
 * @author yrz
 * @brief 文件系统对应的一些参数设置，以及需要的数据结构
 * @version 0.1
 * @status Stable

**/



#define ROOTINO  1   // root i-number
#define BSIZE 1024  // 块大小

// 磁盘布局:
// [ 启动块 | 超级块 | log | 索引节点块 |
//                                          空闲块映射 | 数据块]
//
// mkfs 计算超级块并build初始的文件系统，超级块描述了磁盘布局：
struct superblock {
	uint magic;        // Must be FSMAGIC
	uint size;         // 文件系统镜像大小
	uint nblocks;      // 数据块数量
	uint ninodes;      // 索引节点数量
	uint nlog;         // log块数量 
	uint logstart;     // 第一个log块的块编号
	uint inodestart;   // 第一个索引节点的块编号
	uint bmapstart;    // 第一个空闲块索引块的编号
};

#define FSMAGIC 0x10203040

#define NDIRECT 12
#define NINDIRECT (BSIZE / sizeof(uint))
#define MAXFILE (NDIRECT + NINDIRECT)

// 磁盘索引节点结构
struct dinode {
	short type;           // 文件类型
	short major;          // 最大设备数
	short minor;          // 最小设备数
	short nlink;          // 链接节点数
	uint size;            // 文件大小
	uint addrs[NDIRECT + 1];   // 数据块地址
};

// 每个块的索引节点
#define IPB           (BSIZE / sizeof(struct dinode))

// 包含索引节点i的块
#define IBLOCK(i, sb)     ((i) / IPB + sb.inodestart)

// 每个块的位图
#define BPB           (BSIZE*8)

// 块b对应的位图所在的块号Block of free map containing bit for block b
#define BBLOCK(b, sb) ((b)/BPB + sb.bmapstart)


//目录大小
#define DIRSIZ 14

struct dirent {
	ushort inum;
	char name[DIRSIZ];
};

